package com.ygqh.baby.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import com.ygqh.baby.model.ProcessUserReport;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.query.Criteria;

import com.ygqh.baby.ao.QueryInfo;

public interface BaseMongodbDao<T> {

	/**
	 * 保存单条数据
	 * 
	 * @param _data
	 *            数据集合
	 * @param _collName
	 *            mongodb集合名称
	 * @return
	 * @throws Exception
	 */
	public void insert(Object _data, String _collName) throws Exception;

	/**
	 * 删除数据
	 * 
	 * @param _class
	 *            类class,通过getClass()或.Class获取
	 * @param _criteria
	 *            拼装查询条件,若想删除全部，可以将_criteria赋值为null
	 * @param _collName
	 *            mongodb集合名称
	 * @return int 若返回值为0，则表示删除失败
	 * @throws Exception
	 */
	
	public int delete(Criteria _criteria, String _collName)
			throws Exception;

	/**
	 * 分页删除数据
	 * 
	 * @param _class
	 *            类class,通过getClass()或.Class获取
	 * @param _criteria
	 *            拼装查询条件,若想删除全部，可以将_criteria赋值为null
	 * @param _collName
	 *            mongodb集合名称
	 * @param _limit
	 *            每页的条数
	 * @return int 若返回值为0，则表示删除失败
	 * @throws Exception
	 */
	
	public int delete(Criteria _criteria, String _collName,
			int _limit) throws Exception;

	/**
	 * 执行多次删除数据操作
	 * 
	 * @param _class
	 *            类class,通过getClass()或.Class获取
	 * @param _criterias
	 *            查询条件集合
	 * @param _collName
	 *            mongodb集合名称
	 * @return int 若返回值为0，则表示删除失败
	 * @throws Exception
	 */
	
	public int delete(List<Criteria> _criterias, String _collName)
			throws Exception;

	/**
	 * 根据ID删除数据
	 * 
	 * @param _class
	 *            类class,通过getClass()或.Class获取
	 * @param _id
	 *            id
	 * @return
	 * @throws Exception
	 */
	
	public int deleteById(String _id) throws Exception;

	/**
	 * 根据ID删除数据
	 * 
	 * @param _class
	 *            类class,通过getClass()或.Class获取
	 * @param _ids
	 *            id数组
	 * @return
	 * @throws Exception
	 */
	
	public int deleteByIds(String... _ids) throws Exception;

	/**
	 * 根据ID删除数据
	 * 
	 * @param _class
	 *            类class,通过getClass()或.Class获取
	 * @param _collName
	 *            mongodb集合名称
	 * @param _id
	 *            id
	 * @return
	 * @throws Exception
	 */
	
	public int deleteById(String _collName, String _id)
			throws Exception;

	public int deleteByIds(String _collName, String... _ids)
			throws Exception;

	/**
	 * 根据collName删除集合中所有的数据
	 * 
	 * @param _collName
	 *            mongodb集合名称
	 * @throws Exception
	 */
	public void deleteByCollName(String _collName) throws Exception;

	/**
	 * 根据条件和集合名称删除数据
	 * 
	 * @param _criteria
	 *            拼装查询条件,若想删除全部，可以将_criteria赋值为null
	 * @param _collName
	 *            mongodb集合名称
	 * @param _limit
	 *            每页的条数
	 * @return int
	 * @throws Exception
	 */
	public int deleteByCollNameAndCriteria(Criteria _criteria,
			String _collName, int _limit) throws Exception;

	/**
	 * 根据条件更新数据
	 * 
	 * @param _class
	 *            class,通过getClass()或.Class获取
	 * @param _criteria
	 *            拼装查询条件,若想删除全部，可以将_criteria赋值为null
	 * @param _setMap
	 *            要更新的数据Map
	 * @param _collName
	 *            集合名称
	 * @throws Exception
	 */
	
	public void update(Criteria _criteria,
			HashMap<String, Object> _setMap, String _collName) throws Exception;

	/**
	 * 根据_columnName更新数据
	 * 
	 * @param _class
	 *            class,通过getClass()或.Class获取
	 * @param _column
	 *            根据该字段更新
	 * @param _obj
	 *            要更新数据的条件值
	 * @param _setMap
	 *            要更新的数据Map
	 * @param _collName
	 *            集合名称
	 * @throws Exception
	 */
	
	public void update(String _columnName, Object _obj,
			HashMap<String, Object> _setMap, String _collName) throws Exception;

	/**
	 * 根据_columnName更新数据
	 * @param _class
	 *            class,通过getClass()或.Class获取
	 * @param _criteriaMap
	 *            根据 Map<字段名, 字段值> 更新
	 * @param _setMap
	 *            要更新的数据Map
	 * @param _collName
	 *            集合名称
	 * @throws Exception
	 */
	
	public void update(Map<String, Object> _criteriaMap,
			HashMap<String, Object> _setMap, String _collName) throws Exception;

	/**
	 * 查找mongodb中指定条件的一条信息
	 * 
	 * @param _class
	 *            类class,通过getClass()或.Class获取
	 * @param _criteria
	 *            查询条件
	 * @param _collName
	 *            集合名称
	 * @return
	 * @throws Exception
	 */
	public T findData(Criteria _criteria, String _collName)
			throws Exception;

	/**
	 * 查找mongodb中指定条件的多条信息
	 * 
	 * @param _class
	 *            类class,通过getClass()或.Class获取
	 * @param _criteria
	 *            拼装查询条件,若想查询全部，可以将_criteria赋值为null
	 * @param _collName
	 *            集合名称
	 * @return
	 * @throws Exception
	 */
	public List<T> findDatas(Criteria _criteria,
			String _collName) throws Exception;

	/**
	 * 执行多次查询
	 * 
	 * @param _class
	 *            类class,通过getClass()或.Class获取
	 * @param _criterias
	 *            查询条件集合
	 * @param _collName
	 *            集合名称
	 * @return
	 * @throws Exception
	 */
	public List<T> findDatas(List<Criteria> _criterias,
			String _collName) throws Exception;

	/**
	 * 根据查询条件，分页查询数据
	 * 
	 * @param _class
	 *            类class,通过getClass()或.Class获取
	 * @param _criteria
	 *            查询条件
	 * @param _collName
	 *            集合名称
	 * @param _limit
	 *            每页显示条数
	 * @return
	 * @throws Exception
	 */
	public List<T> findDatasForPage(Criteria _criteria,
			String _collName, int _limit) throws Exception;

	/**
	 * 根据查询条件，分页查询数据
	 * 
	 * @param _class
	 *            类class,通过getClass()或.Class获取
	 * @param _criteria
	 *            查询条件
	 * @param _collName
	 *            集合名称
	 * @param _skip
	 *            跳过多少条
	 * @param _limit
	 *            每页显示条数
	 * @return
	 * @throws Exception
	 */
	public List<T> findDatasForPage(Criteria _criteria,
			String _collName, int _skip, int _limit) throws Exception;

	/**
	 * 根据查询条件，分页查询数据
	 * 
	 * @param _class
	 *            类class,通过getClass()或.Class获取
	 * @param _criterias
	 *            查询条件集合
	 * @param _collName
	 *            集合名称
	 * @param _limit
	 *            每页显示条数
	 * @return
	 * @throws Exception
	 */
	public List<T> findDatasForPage(
			List<Criteria> _criterias, String _collName, int _limit)
			throws Exception;

	/**
	 * 根据查询条件，分页查询数据
	 * 
	 * @param _class
	 *            类class,通过getClass()或.Class获取
	 * @param _criterias
	 *            查询条件集合
	 * @param _collName
	 *            集合名称
	 * @param _skip
	 *            跳过多少条
	 * @param _limit
	 *            每页显示条数
	 * @return
	 * @throws Exception
	 */
	public List<T> findDatasForPage(
			List<Criteria> _criterias, String _collName, int _skip, int _limit)
			throws Exception;

	/**
	 * 根据查询条件，分页查询并删除数据
	 * 
	 * @param _criteria
	 *            查询条件
	 * @param _collName
	 *            集合名称
	 * @param _skip
	 *            跳过多少条
	 * @param _limit
	 *            每页显示条数
	 * @return
	 * @throws Exception
	 */
	public List<T> findAndDeleteDatasForPage(Criteria _criteria,
			String _collName, int _skip, int _limit) throws Exception;

	/**
	 * 查询collName数据总数
	 * 
	 * @author 作者:suxin , E-mail:shupaiqianbi@qq.com
	 * @date 创建时间：2015-12-4 下午2:51:23
	 * @date 最后修改时间：2015-12-4 下午2:51:23
	 * @version
	 * @since
	 * @param _collName
	 *            集合名称
	 * @return
	 * @throws Exception
	 */
	public long count(String _collName) throws Exception;

	/**
	 * 根据查询条件_criteria查询_class在collName数据总数
	 * 
	 * @author 作者:suxin , E-mail:shupaiqianbi@qq.com
	 * @date 创建时间：2015-12-14 上午10:33:19
	 * @date 最后修改时间：2015-12-14 上午10:33:19
	 * @version
	 * @since
	 * @param _criteria
	 *            查询条件
	 * @param _collName
	 *            集合名称
	 * @return
	 * @throws Exception
	 */
	public long count(Criteria _criteria, String _collName) throws Exception;

	/**
	 * 判断集合是否存在
	 * 
	 * @author 作者:suxin , E-mail:shupaiqianbi@qq.com
	 * @date 创建时间：2016-1-12 下午2:42:34
	 * @date 最后修改时间：2016-1-12 下午2:42:34
	 * @version
	 * @since
	 * @param _collName
	 *            集合名称
	 * @return
	 */
	public boolean collectionExists(String _collName) throws Exception;
	
	
	
	/**
	 * 根据查询条件，分页查询数据
	 * 
	 * @param _class
	 *            类class,通过getClass()或.Class获取
	 * @param _criteria
	 *            查询条件
	 * @param _collName
	 *            集合名称
	 * @param _skip
	 *            跳过多少条
	 * @param _limit
	 *            每页显示条数
	 * @param _field
	 *            排序字段
	 * @param _sort
	 *            排序规则
	 * @return
	 * @throws Exception
	 */
	public List<T> findDatasForPage(Criteria _criteria, String _collName, int _skip, int _limit,String _field,int _sort)
			throws Exception;
	
	
	/**
	 * 根据查询条件，分页查询数据
	 * 
	 * @param _class
	 *            类class,通过getClass()或.Class获取
	 * @param _criteria
	 *            查询条件
	 * @param _skip
	 *            跳过多少条
	 * @param _limit
	 *            每页显示条数
	 * @param _field
	 *            排序字段
	 * @param _sort
	 *            排序规则
	 * @return
	 * @throws Exception
	 */
	public List<T> findDatasForPage(Criteria _criteria,int _skip, int _limit,String _field,int _sort)
			throws Exception;

	void insert(Object _data);

	int delete(Criteria _criteria) throws Exception;

	int delete(Criteria _criteria, int _limit) throws Exception;

	int delete(List<Criteria> _criterias) throws Exception;

	void update(Criteria _criteria, HashMap<String, Object> _setMap) throws Exception;

	void update(String _columnName, Object _obj, HashMap<String, Object> _setMap) throws Exception;

	void update(Map<String, Object> _criteriaMap, HashMap<String, Object> _setMap) throws Exception;

	T findData(Criteria _criteria) throws Exception;

	List<T> findDatas(Criteria _criteria) throws Exception;

	List<T> findDatas(List<Criteria> _criterias) throws Exception;

	List<T> findDatasForPage(Criteria _criteria, int _limit) throws Exception;

	List<T> findDatasForPage(Criteria _criteria, int _skip, int _limit) throws Exception;

	List<T> findDatasForPage(List<Criteria> _criterias, int _limit) throws Exception;

	List<T> findDatasForPage(List<Criteria> _criterias, int _skip, int _limit) throws Exception;

	long count();

	long count(Criteria _criteria);

	boolean collectionExists() throws Exception;

	List<T> getPropertyGroupData(Aggregation agg, String _collName, Class<T> outClass);
	
	List<T> getPropertyGroupData(Aggregation agg,Class<T> outClass);

	Map<String, Object> findDatasGroup(String reduce, Criteria _criteria, String _collName, String _fieldName);
	
	Map<String, Object> findDatasGroup(String reduce, Criteria _criteria,String _fieldName);

	long getEntityCount(Map<String, Object> conditions);

	List<T> getEntityList(Map<String, Object> conditions, Map<String, String> orders);

	List<T> getPageEntityList(QueryInfo queryInfo, Map<String, Object> conditions, Map<String, String> orders);

	void saveEntity(Object entity);

	void saveBatch(List<? extends Object> entityList);

	T findEntityById(Serializable id);

	void deleteEntityById(Serializable id);

	void deleteEntity(Object entity);

	List<T> findEntityByIds(Collection<String> ids);

	void updateEntity(Object entity);
	
	void updateByMap(HashMap<String, Object> updateMap,Serializable id);

	List<T> findEntityByMogoIds(Collection<String> ids);

	List<T> findDatasForPage(Criteria _criteria, int _skip, int _limit, LinkedHashMap<String, String> _sortMap);

	void deleteAllEntity();

	void deleteEntityByConditions(Map<String, Object> conditions);

	void updateEntity(Map<String, Object> updateMap, String id);
	
	void saveOrUpdateEntity(Object entity);

	void updateEntities(Map<String, Object> updateMap, Map<String, Object> conditions);

	List<T> getPageEntityList(QueryInfo queryInfo, Criteria criteria, Map<String, String> orders);

	long getEntityCount(Criteria criteria);

	List<T> getEntityList(Criteria criteria);

	List<T> getEntityList(QueryInfo queryInfo, Criteria criteria,Map<String,String> orders);
}
